package main

import (
	"fmt"
	"sync"
)

var once sync.Once

func main() {
	doOnce()
}

func doOnce() {
	onceBody := func() {
		fmt.Println("only once")
	}
	// 用于等待执行完毕
	done := make(chan bool)

	// 启动10个协程执行once.Do(onceBody)
	for i := 0; i < 10; i++ {
		go func() {
			// 把要执行的函数(方法)作为参数传给once.Do方法即可
			once.Do(onceBody)
			done <- true
		}()
	}

	for i := 0; i < 10; i++ {
		<-done
	}
}
